﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BuildHelper.Work.Tools.Forms;
using ProgNetComponentsDx.Browsers;
using ProgNetComponents.Classes;
using ProgNetComponentsDx.Forms;
using BuildHelper.Setup.Pliki;
using ProgNetComponents.Data.SqlCe;

namespace BuildHelper.Work.JAVA
{
    public partial class JavaKlasesForm : FormJavaKlasy
    {
        private NamedObject parametr = new NamedObject("@GRUPA", null);
        private string system = string.Empty;

        private JavaKlasesForm()
        {
            InitializeComponent();
        }
        public JavaKlasesForm(string txt, string system): base (txt)
        {
            InitializeComponent();

            sqlCeDataManager1.AddTableDef(plikiDataSet1.STP_GRUPY_PLIKOW, "SELECT * FROM STP_GRUPY_PLIKOW WHERE STP_GRPL_ID = @GRUPA");
            sqlCeDataManager1.AddTableDef(plikiDataSet1.STP_PLIKI, "SELECT * FROM STP_PLIKI WHERE STP_PL_GRUPA = @GRUPA");
        
            this.system = system;
            this.Text += " " + system;
            memoEdit1.Text = txt;
            labelControl1.Text = labelControl1.Text.Replace("{system}", system);
        }

        private void btnWczytajGrupę_Click(object sender, EventArgs e)
        {
            ReadGroup(true);
        }

        private void btnDodajGrupe_Click(object sender, EventArgs e)
        {
            ReadGroup(false);
        }
        private void ReadGroup(bool clear)
        {
            List<string> pliki = new List<string>();
            if (clear)
                memoEdit1.Text = "";

            if (GetFielsFromGroup(this, memoEdit1.Lines, pliki))
            {
                pliki = GetFilesForSystem(pliki, system);
                memoEdit1.Lines = pliki.ToArray();
            }
        }
        
        protected override bool ValidateAll()
        {
            bool res = true;
            if (memoEdit1.Lines != null)
            {
                foreach (string l in memoEdit1.Lines)
                {
                    if (!l.XMatch("^[\\\\/]?com[/\\\\]scc") )
                    {
                        this.ShowDxErrorDialog(l + " nie jest poprawną ścieżką.\nPodajścieżkę zaczynającą się od com\\scc lub com/scc");
                        res = false;
                        break;
                    }
                    if (l.XMatch("\\.java$"))
                    {
                        this.ShowDxErrorDialog(l + " pliki nie są dozwolone. Podaj katalog.");
                        res = false;
                        break;
                    }
                }
            }
            return res;
        }

        private List<string> GetPliki()
        {
            List<string> list = new List<string>();
            if (this.memoEdit1.Lines != null)
            {
                foreach (string s in memoEdit1.Lines)
                {
                    list.AddIfNotExist(@"%ROOT%\apps\" + system + @"\src\ws\wsjava\src\" + s);
                }
            }
            return list;
        }

        private void btnZapiszGrupe_Click(object sender, EventArgs e)
        {
            if (ValidateAll())
            {
                OperacjeNaPlikach.OperacjeNaPlikachForm.SaveNewGroup(this, GetPliki());
            }
        }

        private void btnZapiszJakoGrupe_Click(object sender, EventArgs e)
        {
            if (ValidateAll())
                OperacjeNaPlikach.OperacjeNaPlikachForm.SaveGroup(this, true, GetPliki());
        }

        private void btnDodajDoGrupy_Click(object sender, EventArgs e)
        {
            if (ValidateAll())
                OperacjeNaPlikach.OperacjeNaPlikachForm.SaveGroup(this, false, GetPliki());
        }

        private static void AddFile(string file, List<string> current)
        {
            string fileName = file.Replace('/', '\\');
            string mask = ".*" + "src\\ws\\wsjava\\src\\com\\scc\\".XEscape() + "(.*)";
            if (file.XMatch(mask))
            {
                fileName = fileName.XReplace("[\\\\/][^\\\\/\\.]*\\.java$", "");
                if (fileName.IsNotNull())
                {
                    fileName = fileName.Replace('\\', '/');
                    if (!current.ContainsIgnoreCase(fileName))
                    {
                        current.Add(fileName);
                    }
                }
            }
        }
        public static bool GetFielsFromGroup(Form parent, string[] current, List<string> pliki)
        {
            ObjectDialogResult dlg = BrowserCache.ShowBrowserDialog(Init.InitFormBrowserNames.Setup.GrupyPlikow);
            if (dlg.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                NamedObject parametr = new NamedObject("@GRUPA", null);
                parametr.Value = dlg.Value;
                PlikiDataSet  plikiDataSet1 = new PlikiDataSet();
                if (current != null)
                {
                    foreach (string p in current)
                        AddFile(p, pliki);
                }
                using (SqlCeDataManager sqlCeDataManager1 = new SqlCeDataManager())
                {
                    sqlCeDataManager1.AddTableDef(plikiDataSet1.STP_GRUPY_PLIKOW, "SELECT * FROM STP_GRUPY_PLIKOW WHERE STP_GRPL_ID = @GRUPA");
                    sqlCeDataManager1.AddTableDef(plikiDataSet1.STP_PLIKI, "SELECT * FROM STP_PLIKI WHERE STP_PL_GRUPA = @GRUPA");

                    if (sqlCeDataManager1.FillDataSet(plikiDataSet1, parametr) && plikiDataSet1.STP_GRUPY_PLIKOW.Rows.Count == 1)
                    {
                        foreach (DataRow r in plikiDataSet1.STP_PLIKI.Rows)
                        {
                            AddFile(r["STP_PL_PLIK"].AsString(), pliki);
                        }
                    }
                    else
                    {
                        parent.ShowDxErrorDialog("Błąd wczytywania grupy plików");
                    }
                }
                return false;
            }
            return true;
        }

        public static List<string> GetFilesForSystem(List<string> pliki, string system)
        {
            List<string> list = new List<string>();
            string mask = ".*" + system + "/src/ws/wsjava/src/com/scc/".XEscape() + "(.*)";
            string fileName;
            foreach (string s in pliki)
            {
                if (s.XMatch(mask))
                {
                    fileName = "/com/scc/" + s.GetFirstMatch(mask).Trim();
                    if (fileName.IsNotNull())
                    {
                        if (!list.ContainsIgnoreCase(fileName))
                        {
                            list.Add(fileName);
                        }
                    }
                }
            }
            return list;
        }
    }
}
